var express = require('express');
var router = express.Router();
const {User} = require('../../models')
const {Op} = require('sequelize')
const {success,failure} = require('../../utils/response')
const {BadRequestError,UnauthorizedError,NotFoundError} = require('../../utils/errors')
const bcrpt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const crypto = require('crypto')//node自带的模块，可以生成随机字符串

router.post('/sign_in',async (req,res) => {
    try {
        // 生成一个32为的随机字符串，hex为编码 作为token的密钥
        //console.log(crypto.randomBytes(32).toString('hex'));
        const {login,password} = req.body
        if(!login){
            throw new BadRequestError('邮箱/用户名必须填写')
        }
        if(!password){
            throw new BadRequestError('密码必须填写')
        }
        const condition = {
            where:{
                [Op.or]:[
                    // 或查询
                    {email:login},
                    {username:login}
                ]
            }
        }
        const user = await User.findOne(condition)
        if(!user){
            throw new NotFoundError('用户不存在，无法登录')
        }
        // 使用bcrypt提供的方法判断密码是否正确,因为数据库中的密码是通过bcrypt加密过的
        // 第一个参数为要比对的密码，第二个为数据库中的密码
        const isPasswordValid = bcrpt.compareSync(password,user.password)
        if(!isPasswordValid){
            throw new UnauthorizedError('密码错误')
        }
        if(user.role !== 100){
            throw new UnauthorizedError('你没有权限登录管理员后台')
        }

        const token = jwt.sign({
            userId:user.id,//存放token的沟通信息
            //SECRET为密钥，可以为随机字符串，存放在根目录的.env环境变量文件中
        },process.env.SECRET,{expiresIn:'30d'})  //30d为token有效期30天

        success(res,'登录成功',{ token })
    } catch (error) {
        failure(res,error)
    }
})

module.exports = router
